package self.xine.basic.thread.communication;

import self.xine.basic.thread.entity.SynchronizedSharedObject;

/**
 * 线程的状态：
 * 	查看java.lang.Thread.State得知有以下几种状态
 *     NEW（新生态）  		当线程尚未开始，即未调用start方法时
 *     RUNNABLE（可运行态） 	线程处于执行中，或等待资源来执行中
 *     BLOCKED（阻塞态） 		线程等待获取某个对象的锁时的状态
 *     WAITING（等待态）		
 *     		当调用了以下方法，处于该状态		
 *     			1、调用了object.await()，直到另一个线程调用了该对象的notify或notifyAll方法
 *     			2、调用了threadObject.join()，直到另一个Thread对象运行结束
 *     			3、调用了LockSupport.park()
 *     		用途：
 *     			等待另一个线程，执行完特定的动作。用于本线程后续的操作，需要依赖一些未成立的条件时
 *
 *	   TIMED_WAITING（计时等待态）
 *   		当调用了带有时间的以下方法时，处于该状态。
 *        		1、Thread.sleep(long millis)
 *        		2、object.wait(long millis)
 *       		3、threadObject.join(long millis)
 *        		4、LockSupport.parkNanos(long millis)
 *        		5、LockSupport.parkUntil(long millis)
 *
 *     TERMINATED(终止态)  当线程运行完成时
 * 
 * @author xine
 * @date 2018年9月8日
 */
public class ThreadStatus implements Runnable {
	
	private SynchronizedSharedObject sharedObject = new SynchronizedSharedObject();
		
	@Override
	public void run() {
		while(sharedObject.getCount() > 0) {
			sharedObject.sub(1);
			System.out.println(Thread.currentThread().getName() + "当前值为：" + sharedObject.getCount());
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
		}		
		
	}
	
	public static void main(String[] args) {
		ThreadStatus threadStatus = new ThreadStatus();
		
		Thread t1 = new Thread(threadStatus,"线程1");
		Thread t2 = new Thread(threadStatus,"线程2");

		t1.start();
		t2.start();
						
		while(t1.isAlive() || t2.isAlive()) {
			System.out.println(t1.getName() + "：" + t1.getState().name()
					+ " " + t2.getName() + "：" + t2.getState().name());
			System.out.println();
		}		
		
	}

}
